package opencm.cli;

import opencm.Especialidade;
import opencm.Main;
import opencm.Medico;
import opencm.Perfil;
import opencm.RepositorioMedico;

import org.joda.time.Duration;

public final class CadastrarMedico extends Acao {
	
	private final RepositorioMedico medicos;

	public CadastrarMedico() {
		this.medicos = Main.repositorioMedico;
	}

	@Override
	public String toString() {
		return "Cadastrar Médico";
	}

	public void executar() {
		Medico medico = null;
		
		while (true) {
			try {
				medico = new Medico(readPerfil(), readEspecialidade());
				break;
			} catch (IllegalArgumentException e) {
				out.println(e.getMessage());
			}
		}
		
		out.println("Duração de Consultas.");
		out.println("As durações são em minutos. Use 0 para o padrão.");
		medico.setDuracaoPrimeiraConsulta(readDuracao("Primeira Consulta"));
		medico.setDuracaoConsultaRetorno(readDuracao("Consulta de Retorno"));
		medico.setDuracaoCirugia(readDuracao("Cirugia Eletiva"));
		
		this.medicos.adicionar(medico);

		out.printf("Médico adicionado com sucesso!%n");
		out.printf("%n");
		out.printf("%20s: %s%n", "Nome", medico.getPerfil().getNome());
		out.printf("%20s: %s%n", "Especialidade", medico.getEspecialidade().toString());
	}
	
	private Duration readDuracao(String prompt) {
		int m = readInt(prompt);
		if (m == 0) {
			return null;
		} else {
			return Duration.standardMinutes(m);
		}
	}

	private Perfil readPerfil() {
		while(true) {
			try {
				return new Perfil(readLine("Nome", true), readLine("CPF [000.000.000-00]", true), readLine("Fone Residêncial [(00)0000-00]", true));
			} catch (IllegalArgumentException e) {
				out.println(e.getMessage());
			}
		}
	}
	
	private Especialidade readEspecialidade() {
		return selecionarUm("Especialidade", Especialidade.toList());
	}

}
